package top.maochang.hou.tools;

import lombok.Data;
import lombok.SneakyThrows;
import org.apache.commons.beanutils.BeanUtils;
import top.maochang.hou.entity.SysMenu;
import top.maochang.hou.vo.SysMenuVo;
import java.util.ArrayList;
import java.util.List;

/**
 * <p>
 * 根据菜单数据构建菜单树的工具类
 * </p>
 */
@Data
public class MenuHelper {

      @SneakyThrows
      public  static List<SysMenuVo> buildTree(List<SysMenu> sysMenuList){
          //创建集合封装最终数据
          List<SysMenuVo> trees = new ArrayList<>();
          //遍历菜单集合
          for (SysMenu sysMenu : sysMenuList) {
              SysMenuVo sysMenuVo=new SysMenuVo();
              BeanUtils.copyProperties(sysMenuVo,sysMenu);
              //找到递归入口，parenTid=0
              if(sysMenuVo.getParentId().longValue()==0){
                  //递归方法找数据放入trees中
                  trees.add(findChildren(sysMenuVo,sysMenuList));
              }
          }
          return trees;
      }

    /**
     * 递归查找子节点
     * 1.从根节点进行递归查询,查询子节点
     * 2.判断 id=parentid是否相同,如果相同是子节点,进行数据封装
     */
    @SneakyThrows
    public static SysMenuVo findChildren(SysMenuVo sysMenuVo, List<SysMenu> treeNodes) {
        //数据的初始化(没意义)
        sysMenuVo.setChildren(new ArrayList<SysMenuVo>());
        //遍历递归进行查找
        for (SysMenu it : treeNodes) {
            //如果是操作权限就跳出本次循环
            if(it.getType()==2){
              continue;
            }
            //父子级--开始对比
            if(Long.parseLong(sysMenuVo.getId().toString())==it.getParentId().longValue()) {
                //解决一个问题父级菜单的path javascript:;---这个是javaweb项目特有的前后端分离不必有
                if(sysMenuVo.getPath()!="javascript:;"){
                    sysMenuVo.setPath("javascript:;");
                }

                //如果集合为空先创建集合，然后塞进入
                if (sysMenuVo.getChildren() == null) {
                    sysMenuVo.setChildren(new ArrayList<>());
                }
                //如果集合不为空就直接递归add添加信息
                SysMenuVo sysMenuVo1=new SysMenuVo();
                BeanUtils.copyProperties(sysMenuVo1,it);
                sysMenuVo.getChildren().add(findChildren(sysMenuVo1,treeNodes));
            }
        }
        return sysMenuVo;
    }
}
